﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

using SIMA.Entities;
using SIMA.Core.Data.Access;
using SIMA.Core.Data.Collection;
using SIMA.Core.Security;
using System.Threading;

namespace SIMA.Services
{
    // NOTA: si cambia aquí el nombre de clase "EquipoService", también debe actualizar la referencia a "EquipoService" en App.config.
    public class EquipoService : IEquipoService
    {
        SmartContainer<T_C_Equipo> equipoSmart;

        public EquipoService()
        {
            DataAccess.SetConnection(SIMA.Core.Enums.AccessType.FromString, "Data Source=.;Initial Catalog=SIMA;Integrated Security=True");
            equipoSmart = new SmartContainer<T_C_Equipo>(false, true);
        }

        #region Miembros de IEquipoService

        public List<SIMA.Entities.T_C_Equipo> GetEquipos(SIMA.Core.Security.Profile securityProfile)
        {
            SecurityProgram.PcProfile = securityProfile;
            equipoSmart.SelectAll();
            return equipoSmart.ToList();
        }

        public IAsyncResult BeginGetEquipos(SIMA.Core.Security.Profile securityProfile, AsyncCallback callback, object state)
        {
            EquiposAsyncResult asyncResult = new EquiposAsyncResult(securityProfile, callback, state);
            ThreadPool.QueueUserWorkItem(new WaitCallback((GetEquiposCallback)), asyncResult);
            return asyncResult;
        }

        private void GetEquiposCallback(object asyncResult)
        {
            EquiposAsyncResult getEquiposAsyncResult = (EquiposAsyncResult)asyncResult;
            try
            {
                getEquiposAsyncResult.CollectionResult = GetEquipos(getEquiposAsyncResult.Profile);
                getEquiposAsyncResult.ExceptionTrace = null;
                getEquiposAsyncResult.MessageResult = string.Empty;
            }
            catch (Exception ex)
            {
                getEquiposAsyncResult.CollectionResult = null;
                getEquiposAsyncResult.ExceptionTrace = ex;
                getEquiposAsyncResult.MessageResult = string.Empty;
            }
            finally
            {
                getEquiposAsyncResult.OnCompleted();
            }
        }

        public List<SIMA.Entities.T_C_Equipo> EndGetEquipos(IAsyncResult asyncResult)
        {
            List<T_C_Equipo> equipos = null;
            using (EquiposAsyncResult getEquiposResult = asyncResult as EquiposAsyncResult)
            {
                getEquiposResult.AsyncWaitHandle.WaitOne();
                equipos = getEquiposResult.CollectionResult;
            }

            return equipos;
        }

        public List<SIMA.Entities.T_C_Equipo> GetEquiposFiltered(SIMA.Core.Security.Profile securityProfile, SIMA.Core.Enums.FilterType filter)
        {
            List<T_C_Equipo> equipos = null;

            return equipos;
        }

        public IAsyncResult BeginGetEquiposFiltered(SIMA.Core.Security.Profile securityProfile, SIMA.Core.Enums.FilterType filter, AsyncCallback callback, object state)
        {
            throw new NotImplementedException();
        }

        public List<SIMA.Entities.T_C_Equipo> EndGetEquiposFiltered(IAsyncResult asyncResult)
        {
            throw new NotImplementedException();
        }

        public string NewEquipo(SIMA.Core.Security.Profile securityProfile, SIMA.Entities.T_C_Equipo newPerfil)
        {
            throw new NotImplementedException();
        }

        public IAsyncResult BeginNewEquipo(SIMA.Core.Security.Profile securityProfile, SIMA.Entities.T_C_Equipo newPerfil, AsyncCallback callback, object state)
        {
            throw new NotImplementedException();
        }

        public string EndNewEquipo(IAsyncResult asyncResult)
        {
            throw new NotImplementedException();
        }

        public string UpdateEquipo(SIMA.Core.Security.Profile securityProfile, SIMA.Entities.T_C_Equipo perfilToUpdate, SIMA.Entities.T_C_Equipo perfilUpdated)
        {
            throw new NotImplementedException();
        }

        public IAsyncResult BeginUpdateEquipo(SIMA.Core.Security.Profile securityProfile, SIMA.Entities.T_C_Equipo perfilToUpdate, SIMA.Entities.T_C_Equipo perfilUpdated, AsyncCallback callback, object state)
        {
            throw new NotImplementedException();
        }

        public string EndUpdateEquipo(IAsyncResult asyncResult)
        {
            throw new NotImplementedException();
        }

        public string DeleteEquipo(SIMA.Core.Security.Profile securityProfile, SIMA.Entities.T_C_Equipo PerfiltoDelete)
        {
            throw new NotImplementedException();
        }

        public IAsyncResult BeginDeleteEquipo(SIMA.Core.Security.Profile securityProfile, SIMA.Entities.T_C_Equipo PerfiltoDelete, AsyncCallback callback, object state)
        {
            throw new NotImplementedException();
        }

        public string EndDeleteEquipo(IAsyncResult asyncResult)
        {
            throw new NotImplementedException();
        }

        public List<SIMA.Entities.T_C_Equipo> CallProcedure(SIMA.Core.Security.Profile securityProfile, string param, SIMA.Core.Enums.CommandType commandType)
        {
            throw new NotImplementedException();
        }

        public IAsyncResult BeginCallProcedure(SIMA.Core.Security.Profile securityProfile, string param, SIMA.Core.Enums.CommandType commandType, AsyncCallback callback, object state)
        {
            throw new NotImplementedException();
        }

        public List<SIMA.Entities.T_C_Equipo> EndCallProcedure(IAsyncResult asyncResult)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
